home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / catlog / all_s < prev    next >
Text File  |  1994-06-01  |  29KB  |  1,467 lines

  1. /* DIVIDE_START=cons.s */
  2. /**************************************************************
  3. ;
  4. ;    コンンソ-ル割り込み設定ル-チン
  5. ;
  6. ;    1991.01.01    Make by Ken
  7. ;
  8. ;**************************************************************/
  9.  
  10. /**************************************************************
  11. ;    各種値の設定
  12. ;**************************************************************/
  13. #define CONBIOS    $0x29        /* 割り込むベクタ番号 */
  14. #define STACK_SIZE (10*1024)    /* ロ-カルスタックサイズ */
  15.  
  16. /**************************************************************
  17. ;    外部参照関数の定義
  18. ;**************************************************************
  19. extrn    CON_bios:near                ; メインのコンソ-ル関数
  20. */
  21.  
  22.  
  23. .lcomm nt_vet_off,4
  24. .lcomm nt_vet_seg,2
  25.  
  26. .lcomm rl_vet_ral,4
  27.  
  28. .lcomm save_esp,4
  29. .lcomm save_ss,2
  30.  
  31. .lcomm stack_flg,2
  32.  
  33. .lcomm new_esp,4
  34. .lcomm new_ss,2
  35.  
  36. consol_path:    .asciz    "CON"
  37. null_path:    .asciz    "NUL"
  38.  
  39. break_flg:    .byte    0
  40.  
  41.     .align    2
  42. .lcomm local_stack,STACK_SIZE
  43. .lcomm local_stack_btm,2
  44.  
  45. /***************************************************
  46. ;
  47. ;    割り込み処理ル-チン
  48. ;
  49. ;***************************************************/
  50. CON_bios_entry:
  51.  
  52.     cmpw    $0,stack_flg
  53.     jne    go_ret
  54.     incw    stack_flg
  55.  
  56.     movl    %esp,save_esp
  57.     movw    %ss,save_ss
  58.     lss    new_esp,%esp
  59.     pushal
  60.  
  61.     sti
  62.     cld
  63.     push    %ds
  64.     pop    %es
  65.  
  66.     movl    %esp,%ebp
  67.     push    %ebp
  68.     call    _CON_bios
  69.     addl    $4,%esp
  70.  
  71.     popal
  72.     lss    save_esp,%esp
  73.     decw    stack_flg
  74. go_ret:    iretl
  75.  
  76.  
  77.  
  78. /**************************************************************
  79. ;
  80. ;    ファイルのリダイレクト処理
  81. ;
  82. ; al    =    ファイルのオ-プンモ-ド
  83. ; bx    =    ファイルパス番号
  84. ; edx    =    NEWデバイスネ-ム
  85. ;
  86. ;**************************************************************/
  87. reopen:
  88.     push    %ax
  89.     movb    $0x3e,%ah
  90.     int    $0x21
  91.     pop    %ax
  92.     movb    $0x3d,%ah
  93.     int    $0x21
  94. reo_ret:ret
  95.  
  96.  
  97. /**************************************************************
  98. ;
  99. ;    コンソ-ル割り込みの設定及び標準入出力の設定
  100. ;
  101. ;
  102. ;void    CON_bios_set(void)
  103. ;
  104. ;**************************************************************/
  105.     .globl    _CON_bios_set
  106. _CON_bios_set:
  107.  
  108.     push    %ds
  109.     push    %es
  110.     push    %ebx
  111.     push    %edx
  112.  
  113.     movw    %ds,new_ss
  114.     leal    local_stack_btm,%ebx
  115.     movl    %ebx,new_esp
  116.  
  117.     movw    $0x2502,%ax
  118.     movb    CONBIOS,%cl
  119.     int    $0x21
  120.     movw    %es,nt_vet_seg
  121.     movl    %ebx,nt_vet_off
  122.  
  123.     movw    $0x2503,%ax
  124.     movb    CONBIOS,%cl
  125.     int    $0x21
  126.     movl    %ebx,rl_vet_ral
  127.  
  128.     movw    $0x2506,%ax
  129.     movb    CONBIOS,%cl
  130.     push    %ds
  131.     movw    %cs,%dx
  132.     movw    %dx,%ds
  133.     leal    CON_bios_entry,%edx
  134.     int    $0x21
  135.     pop    %ds
  136.  
  137.     movb    $0,%al
  138.     movw    $0,%bx
  139.     leal    consol_path,%edx
  140.     call    reopen
  141.     movb    $1,%al
  142.     movw    $1,%bx
  143.     call    reopen
  144.     movb    $1,%al
  145.     movw    $2,%bx
  146.     call    reopen
  147.  
  148.     movw    $0x3300,%ax
  149.     int    $0x21
  150.     movb    %dl,break_flg
  151.  
  152.     movw    $0x3301,%ax
  153.     movb    $0,%dl
  154.     int    $0x21
  155.  
  156.     pop    %edx
  157.     pop    %ebx
  158.     pop    %es
  159.     pop    %ds
  160.     ret
  161.  
  162.  
  163. /**************************************************************
  164. ;
  165. ;    コンソ-ル割り込みを元に戻し標準入出力をNULにする
  166. ;
  167. ;void    CON_bios_ret(void)
  168. ;
  169. ;**************************************************************/
  170.     .globl    _CON_bios_ret
  171. _CON_bios_ret:
  172.  
  173.     push    %ds
  174.     push    %ebx
  175.     push    %edx
  176.  
  177.     movb    CONBIOS,%cl
  178.     movl    rl_vet_ral,%ebx
  179.     movl    nt_vet_off,%edx
  180.     movw    nt_vet_seg,%ax
  181.     push    %ds
  182.     movw    %ax,%ds
  183.     movw    $0x2507,%ax
  184.     int    $0x21
  185.     pop    %ds
  186.  
  187.     movb    $0,%al
  188.     movw    $0,%bx
  189.     leal    null_path,%edx
  190.     call    reopen
  191.     movb    $1,%al
  192.     movw    $1,%bx
  193.     call    reopen
  194.     movb    $1,%al
  195.     movw    $2,%bx
  196.     call    reopen
  197.  
  198.     movw    $0x3301,%ax
  199.     movb    break_flg,%dl
  200.     int    $0x21
  201.  
  202.     pop    %edx
  203.     pop    %ebx
  204.     pop    %ds
  205.     ret
  206.  
  207. /**************************************************************
  208. ;    アセンブラル-チンの終了
  209. ;**************************************************************/
  210. /* DIVIDE_END */
  211.  
  212. /* DIVIDE_START=dspstr.s */
  213. /***************************************************************
  214. ;
  215. ;    16色VRAM文字表示下位ル-チン
  216. ;
  217. ;    1991.01.01    Make by Ken
  218. ;
  219. ;***************************************************************/
  220.  
  221. /**************************************************************
  222. ;    セレクタ値の定義
  223. ;**************************************************************/
  224. #define VRAMSEL    $0x104
  225. #define TBIOSEL    $0x110
  226. #define FONTSEL    $0x138
  227. /**************************************************************
  228. ;    SJIS漢字コ-ドテ-ブルのマスク値定義
  229. ;**************************************************************/
  230. #define ISKAN1 1
  231. #define ISKAN2 2
  232.  
  233. /**************************************************************
  234. ;    ANK文字のVRAMイメ-ジパタ-ンエリア
  235. ;**************************************************************/
  236. .data
  237. .align 2
  238. .lcomm    ankfnt,16*256*4
  239.  
  240. /**************************************************************
  241. ;    カラ-コ-ドを含むVRAMイメ-ジテ-ブル
  242. ;**************************************************************/
  243. .lcomm    fntcol,256*4
  244.  
  245. /**************************************************************
  246. ;    カラ-コ-ドの4ビット1ピクセルテ-ブル
  247. ;**************************************************************/
  248. colptn:
  249. .long    0x00000000,0x11111111,0x22222222,0x33333333
  250. .long    0x44444444,0x55555555,0x66666666,0x77777777
  251. .long    0x88888888,0x99999999,0xaaaaaaaa,0xbbbbbbbb
  252. .long    0xcccccccc,0xdddddddd,0xeeeeeeee,0xffffffff
  253.  
  254. /**************************************************************
  255. ;    16色VRAMビットイメ-ジテ-ブル
  256. ;    1ビット8ピクセル→4ビット8ピクセルへ変換
  257. ;**************************************************************/
  258. fntptn:
  259. .long    0x00000000,0xf0000000,0x0f000000,0xff000000
  260. .long    0x00f00000,0xf0f00000,0x0ff00000,0xfff00000
  261. .long    0x000f0000,0xf00f0000,0x0f0f0000,0xff0f0000
  262. .long    0x00ff0000,0xf0ff0000,0x0fff0000,0xffff0000
  263. .long    0x0000f000,0xf000f000,0x0f00f000,0xff00f000
  264. .long    0x00f0f000,0xf0f0f000,0x0ff0f000,0xfff0f000
  265. .long    0x000ff000,0xf00ff000,0x0f0ff000,0xff0ff000
  266. .long    0x00fff000,0xf0fff000,0x0ffff000,0xfffff000
  267. .long    0x00000f00,0xf0000f00,0x0f000f00,0xff000f00
  268. .long    0x00f00f00,0xf0f00f00,0x0ff00f00,0xfff00f00
  269. .long    0x000f0f00,0xf00f0f00,0x0f0f0f00,0xff0f0f00
  270. .long    0x00ff0f00,0xf0ff0f00,0x0fff0f00,0xffff0f00
  271. .long    0x0000ff00,0xf000ff00,0x0f00ff00,0xff00ff00
  272. .long    0x00f0ff00,0xf0f0ff00,0x0ff0ff00,0xfff0ff00
  273. .long    0x000fff00,0xf00fff00,0x0f0fff00,0xff0fff00
  274. .long    0x00ffff00,0xf0ffff00,0x0fffff00,0xffffff00
  275. .long    0x000000f0,0xf00000f0,0x0f0000f0,0xff0000f0
  276. .long    0x00f000f0,0xf0f000f0,0x0ff000f0,0xfff000f0
  277. .long    0x000f00f0,0xf00f00f0,0x0f0f00f0,0xff0f00f0
  278. .long    0x00ff00f0,0xf0ff00f0,0x0fff00f0,0xffff00f0
  279. .long    0x0000f0f0,0xf000f0f0,0x0f00f0f0,0xff00f0f0
  280. .long    0x00f0f0f0,0xf0f0f0f0,0x0ff0f0f0,0xfff0f0f0
  281. .long    0x000ff0f0,0xf00ff0f0,0x0f0ff0f0,0xff0ff0f0
  282. .long    0x00fff0f0,0xf0fff0f0,0x0ffff0f0,0xfffff0f0
  283. .long    0x00000ff0,0xf0000ff0,0x0f000ff0,0xff000ff0
  284. .long    0x00f00ff0,0xf0f00ff0,0x0ff00ff0,0xfff00ff0
  285. .long    0x000f0ff0,0xf00f0ff0,0x0f0f0ff0,0xff0f0ff0
  286. .long    0x00ff0ff0,0xf0ff0ff0,0x0fff0ff0,0xffff0ff0
  287. .long    0x0000fff0,0xf000fff0,0x0f00fff0,0xff00fff0
  288. .long    0x00f0fff0,0xf0f0fff0,0x0ff0fff0,0xfff0fff0
  289. .long    0x000ffff0,0xf00ffff0,0x0f0ffff0,0xff0ffff0
  290. .long    0x00fffff0,0xf0fffff0,0x0ffffff0,0xfffffff0
  291. .long    0x0000000f,0xf000000f,0x0f00000f,0xff00000f
  292. .long    0x00f0000f,0xf0f0000f,0x0ff0000f,0xfff0000f
  293. .long    0x000f000f,0xf00f000f,0x0f0f000f,0xff0f000f
  294. .long    0x00ff000f,0xf0ff000f,0x0fff000f,0xffff000f
  295. .long    0x0000f00f,0xf000f00f,0x0f00f00f,0xff00f00f
  296. .long    0x00f0f00f,0xf0f0f00f,0x0ff0f00f,0xfff0f00f
  297. .long    0x000ff00f,0xf00ff00f,0x0f0ff00f,0xff0ff00f
  298. .long    0x00fff00f,0xf0fff00f,0x0ffff00f,0xfffff00f
  299. .long    0x00000f0f,0xf0000f0f,0x0f000f0f,0xff000f0f
  300. .long    0x00f00f0f,0xf0f00f0f,0x0ff00f0f,0xfff00f0f
  301. .long    0x000f0f0f,0xf00f0f0f,0x0f0f0f0f,0xff0f0f0f
  302. .long    0x00ff0f0f,0xf0ff0f0f,0x0fff0f0f,0xffff0f0f
  303. .long    0x0000ff0f,0xf000ff0f,0x0f00ff0f,0xff00ff0f
  304. .long    0x00f0ff0f,0xf0f0ff0f,0x0ff0ff0f,0xfff0ff0f
  305. .long    0x000fff0f,0xf00fff0f,0x0f0fff0f,0xff0fff0f
  306. .long    0x00ffff0f,0xf0ffff0f,0x0fffff0f,0xffffff0f
  307. .long    0x000000ff,0xf00000ff,0x0f0000ff,0xff0000ff
  308. .long    0x00f000ff,0xf0f000ff,0x0ff000ff,0xfff000ff
  309. .long    0x000f00ff,0xf00f00ff,0x0f0f00ff,0xff0f00ff
  310. .long    0x00ff00ff,0xf0ff00ff,0x0fff00ff,0xffff00ff
  311. .long    0x0000f0ff,0xf000f0ff,0x0f00f0ff,0xff00f0ff
  312. .long    0x00f0f0ff,0xf0f0f0ff,0x0ff0f0ff,0xfff0f0ff
  313. .long    0x000ff0ff,0xf00ff0ff,0x0f0ff0ff,0xff0ff0ff
  314. .long    0x00fff0ff,0xf0fff0ff,0x0ffff0ff,0xfffff0ff
  315. .long    0x00000fff,0xf0000fff,0x0f000fff,0xff000fff
  316. .long    0x00f00fff,0xf0f00fff,0x0ff00fff,0xfff00fff
  317. .long    0x000f0fff,0xf00f0fff,0x0f0f0fff,0xff0f0fff
  318. .long    0x00ff0fff,0xf0ff0fff,0x0fff0fff,0xffff0fff
  319. .long    0x0000ffff,0xf000ffff,0x0f00ffff,0xff00ffff
  320. .long    0x00f0ffff,0xf0f0ffff,0x0ff0ffff,0xfff0ffff
  321. .long    0x000fffff,0xf00fffff,0x0f0fffff,0xff0fffff
  322. .long    0x00ffffff,0xf0ffffff,0x0fffffff,0xffffffff
  323.  
  324. /**************************************************************
  325. ;    SJIS漢字コ-ドチェックテ-ブル
  326. ;    bit0    SJIS第1コ-ド
  327. ;    bit1    SJIS第2コ-ド
  328. ;**************************************************************/
  329.     .globl    _kantbl
  330. /*
  331. ;        0 1 2 3 4 5 6 7 8 9 A B C D E F
  332. */
  333. _kantbl:
  334.     .byte    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  335.     .byte    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  336.     .byte    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  337.     .byte    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  338.     .byte    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  339.     .byte    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  340.     .byte    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  341.     .byte    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0
  342.     .byte    2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  343.     .byte    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  344.     .byte    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  345.     .byte    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  346.     .byte    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  347.     .byte    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  348.     .byte    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  349.     .byte     3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0
  350.  
  351.  
  352. /**************************************************************
  353. ;
  354. ;    文字色及び背景色テ-ブルとANK文字イメ-ジの初期化
  355. ;
  356. ;void    ctblset(chrcol,bakcol);
  357. ;int    chrcol;        [ebp+8]     文字色(0-15)
  358. ;int    bakcol;        [ebp+12]    背景色(0-15)
  359. ;**************************************************************/
  360. .text
  361.     .globl    _ctblset
  362. .align 2
  363. _ctblset:
  364.     push    %ebp
  365.     movl    %esp,%ebp
  366.  
  367.     push    %esi
  368.     push    %edi
  369.     push    %fs
  370.  
  371.     movzbl    8(%ebp),%eax
  372.     andb    $0x0f,%al
  373.     movl    colptn(,%eax,4),%eax
  374.     movl    %eax,8(%ebp)
  375.  
  376.     movzbl    12(%ebp),%eax
  377.     andb    $0x0f,%al
  378.     movl    colptn(,%eax,4),%eax
  379.     movl    %eax,12(%ebp)
  380.  
  381.     movl    $256,%ecx
  382.     movl    $fntptn,%esi
  383.     movl    $fntcol,%edi
  384. ctblp:    lodsl
  385.     movl    %eax,%edx
  386.     notl    %edx
  387.     andl    8(%ebp),%eax
  388.     andl    12(%ebp),%edx
  389.     orl    %edx,%eax
  390.     stosl
  391.     loop    ctblp
  392.  
  393.     movw    FONTSEL,%ax
  394.     movw    %ax,%fs
  395.     movl    $0x3d800,%esi
  396.     movl    $ankfnt,%edi
  397.  
  398.     movl    $16*256,%ecx
  399. aktb1:    movzbl    %fs:(%esi),%eax
  400.     incl    %esi
  401.     movl    fntcol(,%eax,4),%eax
  402.     stosl
  403.     loop    aktb1
  404.  
  405.     pop    %fs
  406.     pop    %edi
  407.     pop    %esi
  408.     pop    %ebp
  409.     ret
  410.  
  411. /**************************************************************
  412. ;
  413. ;    ANK色付文字イメ-ジをVRAMに転送する
  414. ;
  415. ;【注意】フォント展開時にVRAMの範囲をこえてはならない!
  416. ;
  417. ;void    cwrt_ank(ch,addr)
  418. ;char    ch;        [ebp+8]        ANK文字コ-ド(0-256)
  419. ;int    addr;        [ebp+12]    VRAMアドレス(0-0x3DFFC)
  420. ;**************************************************************/
  421.     .globl    _cwrt_ank
  422. .align 2
  423. _cwrt_ank:
  424.     push    %ebp
  425.     movl    %esp,%ebp
  426.  
  427.     push    %es
  428.     push    %esi
  429.     push    %edi
  430.  
  431.     movw    VRAMSEL,%ax
  432.     movw    %ax,%es
  433.  
  434.     movzbl    8(%ebp),%esi
  435.     shll    $6,%esi
  436.     addl    $ankfnt,%esi
  437.  
  438.     movl    12(%ebp),%edi
  439.     movl    $512-4,%ecx
  440.  
  441.     movsl
  442.     addl    %ecx,%edi
  443.     movsl
  444.     addl    %ecx,%edi
  445.     movsl
  446.     addl    %ecx,%edi
  447.     movsl
  448.     addl    %ecx,%edi
  449.     movsl
  450.     addl    %ecx,%edi
  451.     movsl
  452.     addl    %ecx,%edi
  453.     movsl
  454.     addl    %ecx,%edi
  455.     movsl
  456.     addl    %ecx,%edi
  457.     movsl
  458.     addl    %ecx,%edi
  459.     movsl
  460.     addl    %ecx,%edi
  461.     movsl
  462.     addl    %ecx,%edi
  463.     movsl
  464.     addl    %ecx,%edi
  465.     movsl
  466.     addl    %ecx,%edi
  467.     movsl
  468.     addl    %ecx,%edi
  469.     movsl
  470.     addl    %ecx,%edi
  471.     movsl
  472.     addl    %ecx,%edi
  473.  
  474.     pop    %edi
  475.     pop    %esi
  476.     pop    %es
  477.  
  478.     pop    %ebp
  479.     ret
  480.  
  481. /**************************************************************
  482. ;
  483. ;    SJIS漢字を色付イメ-ジテ-ブルに展開してVRAMに転送する
  484. ;
  485. ;【注意】フォント展開時にVRAMの範囲をこえてはならない!
  486. ;
  487. ;void    cwrt_kan(ch,addr)
  488. ;short    ch;        [ebp+8]        SJIS漢字コ-ド
  489. ;int    addr;        [ebp+12]    VRAMアドレス(0-0x3DFF9)
  490. ;**************************************************************/
  491.     .globl    _cwrt_kan
  492. .align 2
  493. _cwrt_kan:
  494.     push    %ebp
  495.     movl    %esp,%ebp
  496.  
  497.     push    %fs
  498.     push    %gs
  499.     push    %es
  500.     push    %ds
  501.     push    %esi
  502.     push    %edi
  503.     push    %edx
  504.     push    %ebx
  505.  
  506.     movw    VRAMSEL,%ax
  507.     movw    %ax,%es
  508.     movw    TBIOSEL,%ax
  509.     movw    %ax,%fs
  510.     movw    %ds,%ax
  511.     movw    %ax,%gs
  512.  
  513.     movzwl    8(%ebp),%ebx
  514.     shlb    $1,%bh
  515.     cmpb    $0x80,%bl
  516.     adcw    $0x1f61,%bx
  517.     addb    $0x7f,%bl
  518.     jc    wt_kn1
  519.     addb    $0xa2,%bl
  520. wt_kn1:    andb    $0x7f,%bh
  521.  
  522.     movw    $0x100,%ax
  523.     movw    $0x1010,%dx
  524.     lcall    %fs:0xa0
  525.  
  526.  
  527.     movl    %ss:12(%ebp),%edi
  528.     movl    $fntcol,%ebx
  529.  
  530.     xorl    %edx,%edx
  531.     xorl    %ecx,%ecx
  532.  
  533.  
  534.     lodsw
  535.     movb    %al,%cl
  536.     movb    %ah,%dl
  537.     movl    %gs:(%ebx,%ecx,4),%eax
  538.     stosl
  539.     movl    %gs:(%ebx,%edx,4),%eax
  540.     stosl
  541.     addl    $512-4*2,%edi
  542.     lodsw
  543.     movb    %al,%cl
  544.     movb    %ah,%dl
  545.     movl    %gs:(%ebx,%ecx,4),%eax
  546.     stosl
  547.     movl    %gs:(%ebx,%edx,4),%eax
  548.     stosl
  549.     addl    $512-4*2,%edi
  550.     lodsw
  551.     movb    %al,%cl
  552.     movb    %ah,%dl
  553.     movl    %gs:(%ebx,%ecx,4),%eax
  554.     stosl
  555.     movl    %gs:(%ebx,%edx,4),%eax
  556.     stosl
  557.     addl    $512-4*2,%edi
  558.     lodsw
  559.     movb    %al,%cl
  560.     movb    %ah,%dl
  561.     movl    %gs:(%ebx,%ecx,4),%eax
  562.     stosl
  563.     movl    %gs:(%ebx,%edx,4),%eax
  564.     stosl
  565.     addl    $512-4*2,%edi
  566.     lodsw
  567.     movb    %al,%cl
  568.     movb    %ah,%dl
  569.     movl    %gs:(%ebx,%ecx,4),%eax
  570.     stosl
  571.     movl    %gs:(%ebx,%edx,4),%eax
  572.     stosl
  573.     addl    $512-4*2,%edi
  574.     lodsw
  575.     movb    %al,%cl
  576.     movb    %ah,%dl
  577.     movl    %gs:(%ebx,%ecx,4),%eax
  578.     stosl
  579.     movl    %gs:(%ebx,%edx,4),%eax
  580.     stosl
  581.     addl    $512-4*2,%edi
  582.     lodsw
  583.     movb    %al,%cl
  584.     movb    %ah,%dl
  585.     movl    %gs:(%ebx,%ecx,4),%eax
  586.     stosl
  587.     movl    %gs:(%ebx,%edx,4),%eax
  588.     stosl
  589.     addl    $512-4*2,%edi
  590.     lodsw
  591.     movb    %al,%cl
  592.     movb    %ah,%dl
  593.     movl    %gs:(%ebx,%ecx,4),%eax
  594.     stosl
  595.     movl    %gs:(%ebx,%edx,4),%eax
  596.     stosl
  597.     addl    $512-4*2,%edi
  598.     lodsw
  599.     movb    %al,%cl
  600.     movb    %ah,%dl
  601.     movl    %gs:(%ebx,%ecx,4),%eax
  602.     stosl
  603.     movl    %gs:(%ebx,%edx,4),%eax
  604.     stosl
  605.     addl    $512-4*2,%edi
  606.     lodsw
  607.     movb    %al,%cl
  608.     movb    %ah,%dl
  609.     movl    %gs:(%ebx,%ecx,4),%eax
  610.     stosl
  611.     movl    %gs:(%ebx,%edx,4),%eax
  612.     stosl
  613.     addl    $512-4*2,%edi
  614.     lodsw
  615.     movb    %al,%cl
  616.     movb    %ah,%dl
  617.     movl    %gs:(%ebx,%ecx,4),%eax
  618.     stosl
  619.     movl    %gs:(%ebx,%edx,4),%eax
  620.     stosl
  621.     addl    $512-4*2,%edi
  622.     lodsw
  623.     movb    %al,%cl
  624.     movb    %ah,%dl
  625.     movl    %gs:(%ebx,%ecx,4),%eax
  626.     stosl
  627.     movl    %gs:(%ebx,%edx,4),%eax
  628.     stosl
  629.     addl    $512-4*2,%edi
  630.     lodsw
  631.     movb    %al,%cl
  632.     movb    %ah,%dl
  633.     movl    %gs:(%ebx,%ecx,4),%eax
  634.     stosl
  635.     movl    %gs:(%ebx,%edx,4),%eax
  636.     stosl
  637.     addl    $512-4*2,%edi
  638.     lodsw
  639.     movb    %al,%cl
  640.     movb    %ah,%dl
  641.     movl    %gs:(%ebx,%ecx,4),%eax
  642.     stosl
  643.     movl    %gs:(%ebx,%edx,4),%eax
  644.     stosl
  645.     addl    $512-4*2,%edi
  646.     lodsw
  647.     movb    %al,%cl
  648.     movb    %ah,%dl
  649.     movl    %gs:(%ebx,%ecx,4),%eax
  650.     stosl
  651.     movl    %gs:(%ebx,%edx,4),%eax
  652.     stosl
  653.     addl    $512-4*2,%edi
  654.     lodsw
  655.     movb    %al,%cl
  656.     movb    %ah,%dl
  657.     movl    %gs:(%ebx,%ecx,4),%eax
  658.     stosl
  659.     movl    %gs:(%ebx,%edx,4),%eax
  660.     stosl
  661.     addl    $512-4*2,%edi
  662.  
  663.     pop    %ebx
  664.     pop    %edx
  665.     pop    %edi
  666.     pop    %esi
  667.     pop    %ds
  668.     pop    %es
  669.     pop    %gs
  670.     pop    %fs
  671.  
  672.     pop    %ebp
  673.     ret
  674.  
  675. /**************************************************************
  676. ;
  677. ;    上方向に4角枠内を縦16ドットソフトスクロ-ルさせる
  678. ;
  679. ;【注意】sizeは8ドット単位で転送されるので充分に注意!
  680. ;
  681. ;void    vram_scrool(addr,size,line,bakcol)
  682. ;char    *addr;        [ebp+8]        先頭VRAMアドレス
  683. ;int    size;        [ebp+12]    横のドット数
  684. ;int    line;        [ebp+16]    縦のドット数
  685. ;int    bakcol;        [ebp+20]    クリア範囲の文字色
  686. ;
  687. ;int    page;        [ebp-4]        VRAMペ-ジのワ-ク
  688. ;**************************************************************/
  689.     .globl    _vram_scrool
  690. .align 2
  691. _vram_scrool:
  692.     push    %ebp
  693.     movl    %esp,%ebp
  694.  
  695.     movl    8(%ebp),%eax
  696.     andl    $0x40000,%eax
  697.     push    %eax
  698.  
  699.     push    %edi
  700.     push    %esi
  701.     push    %edx
  702.     push    %ecx
  703.     push    %ebx
  704.     push    %es
  705.     push    %ds
  706.     push    %fs
  707.  
  708.     push    %ds
  709.     pop    %fs
  710.  
  711.     movzbl    20(%ebp),%eax
  712.     movl    colptn(,%eax,4),%eax
  713.     movl    %eax,20(%ebp)
  714.  
  715.     movw    VRAMSEL,%ax
  716.     movw    %ax,%es
  717.     movw    %ax,%ds
  718.  
  719.     movl    8(%ebp),%edi
  720.     movl    %edi,%esi
  721.     addl    $512*16,%esi
  722.     andl    $0x3ffff,%esi
  723.     orl    -4(%ebp),%esi
  724.  
  725.     movl    $1024,%ebx
  726.     subl    12(%ebp),%ebx
  727.     shrl    $1,%ebx
  728.  
  729.  
  730.     movl    12(%ebp),%eax
  731.     shrl    $3,%eax
  732.     movl    %eax,12(%ebp)
  733.  
  734.     movl    16(%ebp),%edx
  735. vr_lp:    movl    12(%ebp),%ecx
  736.     rep
  737.     movsl
  738.     addl    %ebx,%esi
  739.     andl    $0x3ffff,%esi
  740.     orl    -4(%ebp),%esi
  741.     addl    %ebx,%edi
  742.     andl    $0x3ffff,%edi
  743.     orl    -4(%ebp),%edi
  744.     decl    %edx
  745.     jne    vr_lp
  746.  
  747.     movl    20(%ebp),%eax
  748.     movl    $16,%edx
  749. vr_cr:    movl    12(%ebp),%ecx
  750.     rep
  751.     stosl
  752.     addl    %ebx,%edi
  753.     andl    $0x3ffff,%edi
  754.     orl    -4(%ebp),%edi
  755.     decl    %edx
  756.     jne    vr_cr
  757.  
  758.     pop    %fs
  759.     pop    %ds
  760.     pop    %es
  761.     pop    %ebx
  762.     pop    %ecx
  763.     pop    %edx
  764.     pop    %esi
  765.     pop    %edi
  766.  
  767.     pop    %eax
  768.  
  769.     pop    %ebp
  770.     ret
  771.  
  772. /**************************************************************
  773. ;
  774. ;    下方向に4角枠内を縦16ドットソフトスクロ-ルさせる
  775. ;
  776. ;【注意】sizeは8ドット単位で転送されるので充分に注意!
  777. ;
  778. ;void    vram_bk_scr(addr,size,line,bakcol)
  779. ;char    *addr;        [ebp+8]        先頭VRAMアドレス
  780. ;int    size;        [ebp+12]    横のドット数
  781. ;int    line;        [ebp+16]    縦のドット数
  782. ;int    bakcol;        [ebp+20]    クリア範囲の文字色
  783. ;
  784. ;int    page;        [ebp-4]        VRAMペ-ジのワ-ク
  785. ;**************************************************************/
  786.     .globl    _vram_bk_scr
  787. _vram_bk_scr:
  788.     push    %ebp
  789.     movl    %esp,%ebp
  790.  
  791.     movl    8(%ebp),%eax
  792.     andl    $0x40000,%eax
  793.     push    %eax
  794.  
  795.     push    %edi
  796.     push    %esi
  797.     push    %edx
  798.     push    %ecx
  799.     push    %ebx
  800.     push    %es
  801.     push    %ds
  802.     push    %fs
  803.  
  804.     push    %ds
  805.     pop    %fs
  806.  
  807.     movzbl    20(%ebp),%eax
  808.     movl    colptn(,%eax,4),%eax
  809.     movl    %eax,20(%ebp)
  810.  
  811.     movw    VRAMSEL,%ax
  812.     movw    %ax,%es
  813.     movw    %ax,%ds
  814.  
  815.     movl    8(%ebp),%esi
  816.     movl    %edi,%edi
  817.     addl    $512*16,%edi
  818.     andl    $0x3ffff,%edi
  819.     orl    -4(%ebp),%edi
  820.  
  821.     movl    $1024,%ebx
  822.     addl    12(%ebp),%ebx
  823.     shrl    $1,%ebx
  824.  
  825.  
  826.     movl    12(%ebp),%eax
  827.     shrl    $3,%eax
  828.     movl    %eax,12(%ebp)
  829.  
  830.     movl    16(%ebp),%edx
  831. br_lp:    movl    12(%ebp),%ecx
  832.     rep
  833.     movsl
  834.     subl    %ebx,%esi
  835.     andl    $0x3ffff,%esi
  836.     orl    -4(%ebp),%esi
  837.     subl    %ebx,%edi
  838.     andl    $0x3ffff,%edi
  839.     orl    -4(%ebp),%edi
  840.     decl    %edx
  841.     jne    br_lp
  842.  
  843.     movl    20(%ebp),%eax
  844.     movl    $16,%edx
  845. br_cr:    movl    12(%ebp),%ecx
  846.     rep
  847.     stosl
  848.     subl    %ebx,%edi
  849.     andl    $0x3ffff,%edi
  850.     orl    -4(%ebp),%edi
  851.     decl    %edx
  852.     jne    br_cr
  853.  
  854.     pop    %fs
  855.     pop    %ds
  856.     pop    %es
  857.     pop    %ebx
  858.     pop    %ecx
  859.     pop    %edx
  860.     pop    %esi
  861.     pop    %edi
  862.  
  863.     pop    %eax
  864.  
  865.     pop    %ebp
  866.     ret
  867.  
  868. /**************************************************************
  869. ;
  870. ;    4角枠内を指定色でクリアする
  871. ;
  872. ;【注意】sizeは8ドット単位でクリアされるので充分に注意!
  873. ;
  874. ;void    vram_cls(addr,size,line,bakcol)
  875. ;char    *addr;        [ebp+8]        先頭VRAMアドレス
  876. ;int    size;        [ebp+12]    横のドット数
  877. ;int    line;        [ebp+16]    縦のドット数
  878. ;int    bakcol;        [ebp+20]    背景色
  879. ;
  880. ;int    page;        [ebp-4]        VRAMペ-ジのワ-ク
  881. ;**************************************************************/
  882.     .globl    _vram_cls
  883. _vram_cls:
  884.     push    %ebp
  885.     movl    %esp,%ebp
  886.  
  887.     movl    8(%ebp),%eax
  888.     andl    $0x40000,%eax
  889.     push    %eax
  890.  
  891.     push    %edi
  892.     push    %edx
  893.     push    %ecx
  894.     push    %ebx
  895.     push    %es
  896.  
  897.     movzbl    20(%ebp),%eax
  898.     movl    colptn(,%eax,4),%eax
  899.     movl    %eax,20(%ebp)
  900.  
  901.     movw    VRAMSEL,%ax
  902.     movw    %ax,%es
  903.     movl    8(%ebp),%edi
  904.  
  905.     movl    $1024,%ebx
  906.     subl    12(%ebp),%ebx
  907.     shrl    $1,%ebx
  908.  
  909.  
  910.     movl    12(%ebp),%eax
  911.     shrl    $3,%eax
  912.     movl    %eax,12(%ebp)
  913.  
  914.     movl    20(%ebp),%eax
  915.     movl    16(%ebp),%edx
  916. vr_clp:    movl    12(%ebp),%ecx
  917.     rep
  918.     stosl
  919.     addl    %ebx,%edi
  920.     andl    $0x3ffff,%edi
  921.     orl    -4(%ebp),%edi
  922.     decl    %edx
  923.     jne    vr_clp
  924.  
  925.     pop    %es
  926.     pop    %ebx
  927.     pop    %ecx
  928.     pop    %edx
  929.     pop    %edi
  930.  
  931.     pop    %eax
  932.  
  933.     pop    %ebp
  934.     ret
  935.  
  936. /**************************************************************
  937. ;
  938. ;    任意のCRTCレジスタに任意のワ-ド値を設定する
  939. ;
  940. ;void    vram_offset(reg,ofs)
  941. ;int    reg;        [ebp+8]        CRTCレジスタNo.
  942. ;int    ofs;        [ebp+12]    設定値
  943. ;**************************************************************/
  944.     .globl    _vram_offset
  945. _vram_offset:
  946.     push    %ebp
  947.     movl    %esp,%ebp
  948.     push    %edx
  949.  
  950.     movb    8(%ebp),%al
  951.     movw    $0x440,%dx
  952.     outb    %al,%dx
  953.     movl    12(%ebp),%eax
  954.     movw    $0x442,%dx
  955.     outw    %ax,%dx
  956.  
  957.     pop    %edx
  958.     pop    %ebp
  959.     ret
  960.  
  961. /**************************************************************
  962. ;
  963. ;    ANK文字をイメ-ジ展開してVRAMに転送する
  964. ;
  965. ;【注意】フォント展開時にVRAMの範囲をこえてはならない!
  966. ;
  967. ;void    wrt_ank(ch,addr,chrcol,bakcol)
  968. ;char    ch;        [ebp+8]        ANK文字コ-ド(0-256)
  969. ;int    addr;        [ebp+12]    VRAMアドレス(0-0x3DFFC)
  970. ;int    chrcol;        [ebp+16]    文字色
  971. ;int    bakcol;        [ebp+20]    背景色
  972. ;**************************************************************/
  973.     .globl    _wrt_ank
  974. _wrt_ank:
  975.     push    %ebp
  976.     movl    %esp,%ebp
  977.  
  978.     push    %fs
  979.     push    %es
  980.     push    %esi
  981.     push    %edi
  982.     push    %edx
  983.     push    %ebx
  984.  
  985.     movzbl    16(%ebp),%eax
  986.     movl    colptn(,%eax,4),%eax
  987.     movl    %eax,16(%ebp)
  988.  
  989.     movzbl    20(%ebp),%eax
  990.     movl    colptn(,%eax,4),%eax
  991.     movl    %eax,20(%ebp)
  992.  
  993.     movw    VRAMSEL,%ax
  994.     movw    %ax,%es
  995.     movw    FONTSEL,%ax
  996.     movw    %ax,%fs
  997.  
  998.     movzbl    8(%ebp),%esi
  999.     shll    $4,%esi
  1000.     addl    $0x3d800,%esi
  1001.  
  1002.     movl    12(%ebp),%edi
  1003.     movl    $16,%ecx
  1004.  
  1005. cwtak1:    movzbl    %fs:(%esi),%eax
  1006.     incl    %esi
  1007.     movl    fntptn(,%eax,4),%eax
  1008.     movl    %eax,%edx
  1009.     notl    %edx
  1010.     andl    16(%ebp),%eax
  1011.     andl    20(%ebp),%edx
  1012.     orl    %edx,%eax
  1013.     movl    %eax,%es:(%edi)
  1014.     addl    $512,%edi
  1015.     loop    cwtak1
  1016.  
  1017.     pop    %ebx
  1018.     pop    %edx
  1019.     pop    %edi
  1020.     pop    %esi
  1021.     pop    %es
  1022.     pop    %fs
  1023.  
  1024.     pop    %ebp
  1025.     ret
  1026.  
  1027. /**************************************************************
  1028. ;
  1029. ;    SJIS漢字をイメ-ジ展開してVRAMに転送する
  1030. ;
  1031. ;【注意】フォント展開時にVRAMの範囲をこえてはならない!
  1032. ;
  1033. ;void    wrt_kan(ch,addr,chrcol,bakcol)
  1034. ;short    ch;        [ebp+8]        SJIS漢字コ-ド
  1035. ;int    addr;        [ebp+12]    VRAMアドレス(0-0x3DFF9)
  1036. ;int    chrcol;        [ebp+16]    文字色
  1037. ;int    bakcol;        [ebp+20]    背景色
  1038. ;**************************************************************/
  1039.     .globl    _wrt_kan
  1040. _wrt_kan:
  1041.     push    %ebp
  1042.     mov    %esp,%ebp
  1043.  
  1044.     push    %fs
  1045.     push    %gs
  1046.     push    %es
  1047.     push    %ds
  1048.     push    %esi
  1049.     push    %edi
  1050.     push    %edx
  1051.     push    %ebx
  1052.  
  1053.     movzbl    16(%ebp),%eax
  1054.     movl    colptn(,%eax,4),%eax
  1055.     movl    %eax,16(%ebp)
  1056.  
  1057.     movzbl    20(%ebp),%eax
  1058.     movl    colptn(,%eax,4),%eax
  1059.     movl    %eax,20(%ebp)
  1060.  
  1061.     movw    VRAMSEL,%ax
  1062.     movw    %ax,%es
  1063.     movw    FONTSEL,%ax
  1064.     movw    %ax,%fs
  1065.  
  1066.     movzwl    8(%ebp),%ebx
  1067.     shlb    $1,%bh
  1068.     cmpb    $0x80,%bl
  1069.     adcw    $0x1f61,%bx
  1070.     addb    $0x7f,%bl
  1071.     jc    cwtkn1
  1072.     addb    $0xa2,%bl
  1073. cwtkn1:    andb    $0x7f,%bh
  1074.  
  1075.     movw    $0x100,%ax
  1076.     movw    $0x1010,%dx
  1077.     push    %ds
  1078.     lcall    %fs:0xa0
  1079.  
  1080.     push    %ds
  1081.     pop    %gs
  1082.     pop    %ds
  1083.  
  1084.     movl    12(%ebp),%edi
  1085.     movl    $16,%ecx
  1086.  
  1087. cwtkn2:    movzbl    %gs:(%esi),%eax
  1088.     incl    %esi
  1089.     movl    fntptn(,%eax,4),%eax
  1090.     movl    %eax,%edx
  1091.     notl    %edx
  1092.     andl    16(%ebp),%eax
  1093.     andl    20(%ebp),%edx
  1094.     orl    %edx,%eax
  1095.     movl    %eax,%es:(%edi)
  1096.  
  1097.     movzbl    %gs:(%esi),%eax
  1098.     incl    %esi
  1099.     movl    fntptn(,%eax,4),%eax
  1100.     movl    %eax,%edx
  1101.     notl    %edx
  1102.     andl    16(%ebp),%eax
  1103.     andl    20(%ebp),%edx
  1104.     orl    %edx,%eax
  1105.     movl    %eax,%es:4(%edi)
  1106.  
  1107.     addl    $512,%edi
  1108.     loop    cwtkn2
  1109.  
  1110.     pop    %ebx
  1111.     pop    %edx
  1112.     pop    %edi
  1113.     pop    %esi
  1114.     pop    %ds
  1115.     pop    %es
  1116.     pop    %gs
  1117.     pop    %fs
  1118.  
  1119.     pop    %ebp
  1120.     ret
  1121.  
  1122. /**************************************************************
  1123. ;
  1124. ;    安易なカ-ソルを表示させる
  1125. ;
  1126. ;【注意】VRAMの範囲をこえてはならない!
  1127. ;
  1128. ;void    wrt_cur(addr,line)
  1129. ;int    addr;        [esp+4]        VRAMアドレス(0-0x3DFFC)
  1130. ;int    line;        [esp+8]        縦ライン数
  1131. ;**************************************************************/
  1132.     .globl    _wrt_cur
  1133. _wrt_cur:
  1134.  
  1135.     movl    4(%esp),%eax
  1136.     movl    8(%esp),%ecx
  1137.  
  1138.     orl    %ecx,%ecx
  1139.     je    wtcule        /* カーソルサイズが0の時はカーソルを表示しない */
  1140.  
  1141.     push    %fs
  1142.     push    %bx
  1143.  
  1144.     movw    VRAMSEL,%bx
  1145.     movw    %bx,%fs
  1146.  
  1147. wtculp:    notl    %fs:(%eax)
  1148.     addl    $512,%eax
  1149.     loop    wtculp
  1150.  
  1151.     pop    %bx
  1152.     pop    %fs
  1153. wtcule:    ret
  1154.  
  1155.  
  1156. /* DIVIDE_END */
  1157.  
  1158. /* DIVIDE_START=egb_b2.s */
  1159. /*
  1160.     T-BIOS Graphics Library
  1161.         for GNU assembler
  1162.                 by Waku Factory
  1163.              90/03/20 Ver 1.0
  1164.          90/10/11     1.2
  1165. */
  1166.     .globl _EGB_getBlockColor
  1167.     .globl _EGB_putBlockColor
  1168.     .globl _EGB_getBlock
  1169.     .globl _EGB_putBlock
  1170.     .globl _EGB_getBlockZoom
  1171.     .globl _EGB_putBlockZoom
  1172.  
  1173.  
  1174.     .data
  1175.     .text
  1176. /****************************************
  1177.      EGB  block operation  2 / 3
  1178.  ****************************************/
  1179.  
  1180. /*
  1181.     EGB_getBlockColor( char *gwork, char *param ) 矩形領域読みだし(色指定)
  1182. */
  1183.     .align 4
  1184. _EGB_getBlockColor:
  1185.     push  %edi
  1186.     push  %esi
  1187.     movl  16(%esp),%esi
  1188.     movb  $0x22,%ah
  1189.     movl  12(%esp),%edi
  1190.     push  $0x0110
  1191.     pop   %fs
  1192.     lcall %fs:(0x20)
  1193.     movsbl %ah,%eax
  1194.     pop   %esi
  1195.     pop   %edi
  1196.     ret
  1197.  
  1198. /*
  1199.     EGB_putBlockColor( char *gwork,int clip, char *param ) 矩形領域書き込み(色指定)
  1200. */
  1201.     .align 4
  1202. _EGB_putBlockColor:
  1203.     push  %edi
  1204.     push  %esi
  1205.     movw  16(%esp),%al
  1206.     movl  20(%esp),%esi
  1207.     movb  $0x23,%ah
  1208.     movl  12(%esp),%edi
  1209.     push  $0x0110
  1210.     pop   %fs
  1211.     lcall %fs:(0x20)
  1212.     movsbl %ah,%eax
  1213.     pop   %esi
  1214.     pop   %edi
  1215.     ret
  1216.  
  1217. /*
  1218.     EGB_getBlock( char *gwork,char *param ) 矩形領域読みだし(フルカラー)
  1219. */
  1220.     .align 4
  1221. _EGB_getBlock:
  1222.     push  %edi
  1223.     push  %esi
  1224.     movl  16(%esp),%esi
  1225.     movb  $0x24,%ah
  1226.     movl  12(%esp),%edi
  1227.     push  $0x0110
  1228.     pop   %fs
  1229.     lcall %fs:(0x20)
  1230.     movsbl %ah,%eax
  1231.     pop   %esi
  1232.     pop   %edi
  1233.     ret
  1234.  
  1235. /*
  1236.     EGB_putBlock( char *gwork, int clip, char *param ) 矩形領域書き込み(フルカラー)
  1237. */
  1238.     .align 4
  1239. _EGB_putBlock:
  1240.     push  %edi
  1241.     push  %esi
  1242.     movb  16(%esp),%al
  1243.     movl  20(%esp),%esi
  1244.     movb  $0x25,%ah
  1245.     movl  12(%esp),%edi
  1246.     push  $0x0110
  1247.     pop   %fs
  1248.     lcall %fs:(0x20)
  1249.     movsbl %ah,%eax
  1250.     pop   %esi
  1251.     pop   %edi
  1252.     ret
  1253.  
  1254. /*
  1255.     EGB_getBlockZoom( char *gwork, char *param ) 矩形領域読みだし(ズーム付)
  1256. */
  1257.     .align 4
  1258. _EGB_getBlockZoom:
  1259.     push  %edi
  1260.     push  %esi
  1261.     movl  16(%esp),%esi
  1262.     movb  $0x26,%ah
  1263.     movl  12(%esp),%edi
  1264.     push  $0x0110
  1265.     pop   %fs
  1266.     lcall %fs:(0x20)
  1267.     movsbl %ah,%eax
  1268.     pop   %esi
  1269.     pop   %edi
  1270.     ret
  1271.  
  1272. /*
  1273.     EGB_putBlockZoom( char *gwork,int clip, char *param ) 矩形領域書き込み(ズーム付)
  1274. */
  1275.     .align 4
  1276. _EGB_putBlockZoom:
  1277.     push  %edi
  1278.     push  %esi
  1279.     movb  16(%esp),%al
  1280.     movl  20(%esp),%esi
  1281.     movb  $0x27,%ah
  1282.     movl  12(%esp),%edi
  1283.     push  $0x0110
  1284.     pop   %fs
  1285.     lcall %fs:(0x20)
  1286.     movsbl %ah,%eax
  1287.     pop   %esi
  1288.     pop   %edi
  1289.     ret
  1290. /* DIVIDE_END */
  1291.  
  1292. /* DIVIDE_START=vram.s */
  1293. /***************************************************************
  1294. ;
  1295. ;    16色VRAM文字表示下位ル-チン
  1296. ;
  1297. ;    1991.01.01    Make by 山先
  1298. ;
  1299. ;***************************************************************/
  1300.  
  1301. /**************************************************************
  1302. ;    セレクタ値の定義
  1303. ;**************************************************************/
  1304. #define VRAMSEL    $0x104
  1305.  
  1306. /**************************************************************
  1307. ;
  1308. ;    4角枠内のデータをロードする
  1309. ;
  1310. ;    VRAM → data
  1311. ;
  1312. ;【注意】sizeは8ドット単位でロードされるので充分に注意!
  1313. ;
  1314. ;void    _vram_load(addr,size,line,data)
  1315. ;int    addr;        [ebp+8]        先頭VRAMアドレス
  1316. ;int    size;        [ebp+12]    横のドット数
  1317. ;int    line;        [ebp+16]    縦のドット数
  1318. ;char    *data;        [ebp+20]    ロードするアドレス
  1319. ;
  1320. ;int    page;        [ebp-4]        VRAMペ-ジのワ-ク
  1321. ;**************************************************************/
  1322.     .globl    __vram_load
  1323. __vram_load:
  1324.     push    %ebp
  1325.     movl    %esp,%ebp
  1326.  
  1327.     movl    8(%ebp),%eax        /* 先頭VRAMアドレス */
  1328.     andl    $0x40000,%eax
  1329.     push    %eax            /* page */
  1330.  
  1331.     push    %edi
  1332.     push    %esi
  1333.     push    %edx
  1334.     push    %ecx
  1335.     push    %ebx
  1336.     push    %es
  1337.     push    %ds
  1338.     push    %fs
  1339.  
  1340.     push    %ds
  1341.     pop    %fs
  1342.  
  1343.     movw    VRAMSEL,%ax
  1344.     movw    %ax,%ds            /* DS:ESI → ES:EDI */
  1345.  
  1346.     movl    20(%ebp),%edi        /* 保存するアドレス */
  1347.  
  1348.     movl    8(%ebp),%esi        /* 先頭VRAMアドレス */
  1349.     andl    $0x3ffff,%esi
  1350.     orl    -4(%ebp),%esi        /* page */
  1351.  
  1352.     movl    $1024,%ebx
  1353.     subl    12(%ebp),%ebx        /* 横のドット数 */
  1354.     shrl    $1,%ebx            /* 丸める */
  1355.  
  1356.  
  1357.     movl    12(%ebp),%eax        /* 横のドット数 */
  1358.     shrl    $3,%eax            /* 8ドットに丸める */
  1359.     movl    %eax,12(%ebp)        /* 横のドット数 */
  1360.  
  1361.     movl    16(%ebp),%edx        /* 縦のドット数 */
  1362. vr_lad:    movl    12(%ebp),%ecx        /* 繰り返しの数 */
  1363.     rep
  1364.     movsl
  1365.     addl    %ebx,%esi        /* 転送元(VRAM) */
  1366.     andl    $0x3ffff,%esi
  1367.     orl    -4(%ebp),%esi
  1368.     decl    %edx
  1369.     jne    vr_lad
  1370.  
  1371.     pop    %fs
  1372.     pop    %ds
  1373.     pop    %es
  1374.     pop    %ebx
  1375.     pop    %ecx
  1376.     pop    %edx
  1377.     pop    %esi
  1378.     pop    %edi
  1379.  
  1380.     pop    %eax
  1381.  
  1382.     pop    %ebp
  1383.     ret
  1384.  
  1385. /**************************************************************
  1386. ;
  1387. ;    4角枠内のデータをセーブする
  1388. ;
  1389. ;    data → VRAM
  1390. ;
  1391. ;【注意】sizeは8ドット単位でセーブされるので充分に注意!
  1392. ;
  1393. ;void    _vram_save(addr,size,line,data)
  1394. ;int    addr;        [ebp+8]        先頭VRAMアドレス
  1395. ;int    size;        [ebp+12]    横のドット数
  1396. ;int    line;        [ebp+16]    縦のドット数
  1397. ;char    *data;        [ebp+20]    ロードするアドレス
  1398. ;
  1399. ;int    page;        [ebp-4]        VRAMペ-ジのワ-ク
  1400. ;**************************************************************/
  1401.     .globl    __vram_save
  1402. __vram_save:
  1403.     push    %ebp
  1404.     movl    %esp,%ebp
  1405.  
  1406.     movl    8(%ebp),%eax        /* 先頭VRAMアドレス */
  1407.     andl    $0x40000,%eax
  1408.     push    %eax            /* page */
  1409.  
  1410.     push    %edi
  1411.     push    %esi
  1412.     push    %edx
  1413.     push    %ecx
  1414.     push    %ebx
  1415.     push    %es
  1416.     push    %ds
  1417.     push    %fs
  1418.  
  1419.     push    %ds
  1420.     pop    %fs
  1421.  
  1422.     movw    VRAMSEL,%ax
  1423.     movw    %ax,%es            /* DS:ESI → ES:EDI */
  1424.  
  1425.     movl    20(%ebp),%esi        /* セーブするデータのアドレス */
  1426.  
  1427.     movl    8(%ebp),%edi        /* 先頭VRAMアドレス */
  1428.     andl    $0x3ffff,%edi
  1429.     orl    -4(%ebp),%edi        /* page */
  1430.  
  1431.     movl    $1024,%ebx
  1432.     subl    12(%ebp),%ebx        /* 横のドット数 */
  1433.     shrl    $1,%ebx            /* 丸める */
  1434.  
  1435.  
  1436.     movl    12(%ebp),%eax        /* 横のドット数 */
  1437.                     /* 8ドット単位で転送するので */
  1438.     shrl    $3,%eax            /* 8ドットに丸める */
  1439.     movl    %eax,12(%ebp)        /* 横のドット数 */
  1440.  
  1441.     movl    16(%ebp),%edx        /* 縦のドット数 */
  1442. vr_sav:    movl    12(%ebp),%ecx        /* 繰り返しの数 */
  1443.     rep
  1444.     movsl
  1445.     addl    %ebx,%edi        /* 転送先(VRAM) */
  1446.     andl    $0x3ffff,%edi
  1447.     orl    -4(%ebp),%edi
  1448.     decl    %edx
  1449.     jne    vr_sav
  1450.  
  1451.     pop    %fs
  1452.     pop    %ds
  1453.     pop    %es
  1454.     pop    %ebx
  1455.     pop    %ecx
  1456.     pop    %edx
  1457.     pop    %esi
  1458.     pop    %edi
  1459.  
  1460.     pop    %eax
  1461.  
  1462.     pop    %ebp
  1463.     ret
  1464.  
  1465. /* DIVIDE_END */
  1466.  
  1467.